package DAO;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import Model.AcessoVascular;
import Utils.Conexao;

import com.mysql.jdbc.CallableStatement;

public class AcessoVascularDAO {
	public static void Insert(AcessoVascular acesso) throws SQLException
	{
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_insert_acesso_vascular(?, ?, ?, ?, ?, ?, ?, ?, ?)";			
		CallableStatement call = AcessoVascularDAO.setObjectCallableStatement(acesso, mysqlCall, con);
		call.execute();
		con.close();		
		call.close();
	}
	
	public static void Update(AcessoVascular acesso) throws SQLException
	{		
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_update_acesso_vascular(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";		
		CallableStatement call = AcessoVascularDAO.setObjectCallableStatement(acesso, mysqlCall, con) ;
		call.executeUpdate();
		con.close();
		call.close();
	}	
	
	public static ArrayList<AcessoVascular> GetArrayListAcessoVascular()
	{
		ArrayList<AcessoVascular> arrAcesso = new ArrayList<AcessoVascular>();
		try {			
			Connection con = Conexao.getConection();
			String mysqlCall = "call spc_select_acessos_vasculares()";			
			CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);			
			ResultSet res = call.executeQuery();
			
			while(res.next())
			{
				AcessoVascular acesso = AcessoVascularDAO.SetInstance(res);
				arrAcesso.add(acesso);
			}
			
			call.close();
			con.close();
			
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return arrAcesso;
	}
	
	public static AcessoVascular LoadObject(int id) throws SQLException
	{		
		AcessoVascular acesso = null;
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_select_acesso_vascular_por_id(?)";
		CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, id);
		ResultSet res = call.executeQuery();		
		
		if(res.next())
			acesso = AcessoVascularDAO.SetInstance(res);
		
		call.close();
		con.close();
		
		return acesso;
	}	
	
	
	public static void DeletarAcessoVascular(int idAcessoVascular) throws SQLException
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_inativar_acesso_vascular(?)";
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, idAcessoVascular);
		call.execute();
		con.close();
		call.close();		
	}
	
	private static CallableStatement setObjectCallableStatement(AcessoVascular acesso, String mysqlCall, Connection con ) throws SQLException
	{		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setDate(1, acesso.getDataUtilizacao());
		call.setDate(2, acesso.getDataRetirada());
		call.setString(3, acesso.getMotivo());
		call.setString(4, acesso.getMedicoCirurgiao());
		call.setString(5, acesso.getNomeHospital());
		call.setInt(6, acesso.getTipoAcesso());
		call.setString(7, acesso.getRevisao());
		call.setInt(8, acesso.getIdPaciente());
		call.setInt(9, acesso.getIdUsuario());
		
		if(acesso.getIdAcessoVascular() > 0)
			call.setInt(10, acesso.getIdAcessoVascular());
		
		return call; 		
	}
	
	private static AcessoVascular SetInstance(ResultSet res) throws SQLException
	{
		AcessoVascular acessoVascular = new AcessoVascular();
		
		acessoVascular.setIdAcessoVascular(res.getInt("id_acesso_vascular"));
		acessoVascular.setDataUtilizacao(res.getDate("data_utilizacao"));
		acessoVascular.setDataRetirada(res.getDate("data_retirada"));
		acessoVascular.setMotivo(res.getString("motivo"));
		acessoVascular.setMedicoCirurgiao(res.getString("medico_cirurgiao"));
		acessoVascular.setNomeHospital(res.getString("nome_hospital"));
		acessoVascular.setTipoAcesso(res.getInt("tipo_acesso"));
		acessoVascular.setRevisao(res.getString("revisao"));
		acessoVascular.setIdUsuario(res.getInt("id_usuario"));
		acessoVascular.setIdPaciente(res.getInt("id_paciente"));
		acessoVascular.setPaciente(PacienteDAO.LoadObject(res.getInt("id_paciente")));
		acessoVascular.setUsuario(UsuarioDAO.LoadObject(res.getInt("id_usuario")));
		
		return acessoVascular;
	}
	
}
